package com.stock.config;


import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.stock.pojo.vo.StockInfoConfig;
import com.stock.utils.IdWorker;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;



//TODO：定义公共配置类
@Configuration
//引入application-stock.yml中的数据 -- 加载这个配置类
@EnableConfigurationProperties(StockInfoConfig.class)
public class CommonConfig {

    //TODO：密码加密器
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    /**
     * TODO：配置并初始化ID生成器
     *
     * ID生成器用于在分布式系统中生成全局唯一ID
     * 该方法使用@Bean注解，表示将返回的对象实例化为Spring容器中的Bean
     *
     * @return IdWorker 实例，用于生成全局唯一ID
     */
    @Bean
    public IdWorker idWorker() {
        // 实例化IdWorker对象，传入机器节点ID和数据中心ID
        // 1l 表示机器节点ID
        // 2l 表示数据中心ID
        // 这些参数需要根据实际情况进行配置
        return new IdWorker(1l,2l);
    }

    // TODO：配置Caffeine缓存
    @Bean
    public Cache<String,Object> caffeineCache(){
        Cache<String, Object> cache = Caffeine
                .newBuilder()
                .maximumSize(200)//设置缓存数量上限
//                .expireAfterAccess(1, TimeUnit.SECONDS)//访问1秒后删除
//                .expireAfterWrite(1,TimeUnit.SECONDS)//写入1秒后删除
                .initialCapacity(100)// 初始的缓存空间大小
                .recordStats()//开启统计
                .build();
        return cache;
    }
}
